import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;
/**
 * Write a description of class Revision here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Revision extends Actor
{
    private int nivel;
    private int nuevoNivel;
    private HtmlWorld hW;
    private int calificacion = 0;
    /**
     * lista que se llena dependiendo del nivel en el que se encuentra
     */
    private List<String> listaDeTagsEnHoja;
    private boolean evaluaAhora = false;
    /**
     * lista que se evaluara es decir donde se quedo el usuario 
     */
    private List<String> listaEvalua; 

    /**
     * Constructor de Revision inicializa hW htmlWorld con la variable del mundo
     */
    public Revision(HtmlWorld w)
    {
        hW = w;
    }
    
    /**
     * Act - do whatever the Revision wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        if(evaluaAhora)
        {
            nivel = hW.dameNivel();
            //Pide la lista Patron para saber la calificacion
            listaDeTagsEnHoja = hW.dameListaDeTags();
            //Pide la lista que lleno el usuario
            listaEvalua = hW.dameListaAEvaluar();
            evalua(listaDeTagsEnHoja,listaEvalua);
            califica();
        }
        
    }   
    
    /**
     * Este método se encarga de evaluar al usuario y su avance para ver si es que puede aprobar el nivel o no
     * @<param> listaDebe es lo que debe tener el usuario
     * @<param> listaTiene es lo que tiene el usuario y se evaluara por eso.
     */
    public void evalua(List<String> listaDebe, List<String> listaTiene)
    {
        int i;
        for(i = 0; i < listaDebe.size(); i++)
        {
            if(listaTiene.indexOf(listaDebe.get(i)) != -1) //Si se encuentra lo que debe en lo que tiene
            {
                calificacion += 10;
            }
            else // Se le deben de restar puntos 
            {
                calificacion -= 10;
            }
        }
        evaluaAhora = false;
    }
    
    /**
     * Este método se incorpora a la clase para asignar una calificacion aprobatoria o reprobatoria segun sea el caso
     */
    public void califica()
    {
        boolean paso;
            if(calificacion/listaDeTagsEnHoja.size() > 5 || calificacion/listaDeTagsEnHoja.size() == 2 )
            {
                paso = true;
                nuevoNivel = (hW.dameNivel() + 1);
                hW.ponNivel(nuevoNivel);
                if(nuevoNivel == 6)
                {
                   //Termino el curso con exito
                   setImage("termino.png");
                   hW.ponNivel(1);
                }
                else
                {
                    //Solo avanzo de nivel
                    hW.addObject(new siguienteNivel(),395,313);
                    hW.cambioNivel();
                    
                }
            }
            else
                paso = false;
    }
    
    /**
     * Hace tiempo para quitar los objetos existentes
     */
    public void haceTiempo()
    {
        for(int i = 0; i < 50000; i++);
        
    }
    
    /**
     * Este metodo fue diseñado para que desde el contructor se pueda 
     * dar el banderazo para que se comience a evaluar
     */
    public void comienza()
    {
        evaluaAhora = true;
    }
    
  
    
    /**
     * Metodo que compara la lista de nivel uno de la hoja con los de la vista Previa
     */
    public boolean comparaListas(int nivel)
    {
        return true;
    }
}
